const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

// 日志工具函数
const logInfo = (message, data = null) => {
  const timestamp = new Date().toISOString();
  console.log(`[INFO] ${timestamp} - ${message}`);
  if (data) console.log(JSON.stringify(data, null, 2));
};

const logError = (message, error) => {
  const timestamp = new Date().toISOString();
  console.error(`[ERROR] ${timestamp} - ${message}`);
  if (error) console.error(error);
};

const app = express();
const PORT = process.env.PORT || 5001;
const JWT_SECRET = 'xuxiao'; // 在实际生产环境中应该使用环境变量

// 中间件
app.use(cors({
  origin: '*', // 允许所有来源的跨域请求
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // 允许的HTTP方法
  allowedHeaders: ['Content-Type', 'Authorization', 'x-auth-token'] // 允许的请求头
}));
logInfo('CORS中间件已配置');

app.use(bodyParser.json());
logInfo('Body解析中间件已配置');

// 请求日志中间件
app.use((req, res, next) => {
  logInfo(`收到${req.method}请求: ${req.url}`, {
    headers: req.headers['x-auth-token'] ? {'x-auth-token': '已提供'} : {},
    query: req.query,
    ip: req.ip
  });
  next();
});

// 模拟用户数据库
const users = [
  {
    id: 1,
    username: 'admin',
    // 密码: admin123
    password: '$2a$10$yNl2Mup.3ziY.4EKYpPUaerap.L2QVgeLqt.g.eDAf38SD1uOU.cu'
  }
];

// 路由
app.get('/', (req, res) => {
  logInfo('访问根路由');
  res.send('API 运行中...');
});

// 用户登录
app.post('/api/login', async (req, res) => {
  const { username, password } = req.body;
  logInfo('收到登录请求', { username });

  // 验证
  if (!username || !password) {
    logError('登录失败: 缺少用户名或密码');
    return res.status(400).json({ msg: '请提供用户名和密码' });
  }

  try {
    // 检查用户是否存在
    const user = users.find(user => user.username === username);
    if (!user) {
      logError(`登录失败: 用户不存在 - ${username}`);
      return res.status(400).json({ msg: '用户不存在' });
    }

    // 验证密码
    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) {
      logError(`登录失败: 密码不正确 - ${username}`);
      return res.status(400).json({ msg: '密码不正确' });
    }

    // 创建 JWT Token
    const payload = {
      user: {
        id: user.id
      }
    };

    jwt.sign(
      payload,
      JWT_SECRET,
      { expiresIn: '1h' },
      (err, token) => {
        if (err) {
          logError('生成Token失败', err);
          throw err;
        }
        logInfo(`用户登录成功 - ${username}`, { userId: user.id });
        res.json({ token });
      }
    );
  } catch (err) {
    logError('登录过程中发生服务器错误', err);
    res.status(500).send('服务器错误');
  }
});

// 获取当前用户信息（需要验证）
app.get('/api/user', (req, res) => {
  logInfo('收到获取用户信息请求');
  try {
    // 从请求头获取 token
    const token = req.header('x-auth-token');
    
    if (!token) {
      logError('获取用户信息失败: 没有提供令牌');
      return res.status(401).json({ msg: '没有令牌，授权失败' });
    }

    // 验证 token
    const decoded = jwt.verify(token, JWT_SECRET);
    logInfo('Token验证成功', { userId: decoded.user.id });
    
    const user = users.find(user => user.id === decoded.user.id);
    
    if (!user) {
      logError(`获取用户信息失败: 用户ID不存在 - ${decoded.user.id}`);
      return res.status(404).json({ msg: '用户不存在' });
    }

    // 返回用户信息（不包括密码）
    logInfo(`成功获取用户信息 - ${user.username}`);
    res.json({
      id: user.id,
      username: user.username
    });
  } catch (err) {
    logError('验证Token失败', err);
    res.status(401).json({ msg: '令牌无效' });
  }
});

app.listen(PORT, () => {
  logInfo(`服务器成功启动在端口 ${PORT}`);
  logInfo('环境变量:', { PORT: process.env.PORT, NODE_ENV: process.env.NODE_ENV });
});